package com.cskaoyan.javase.oop2.fieldhidden7;

/**
 * @description: 子类中的成员变量的隐藏
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 子父类中能否拥有同名的属性呢？
 * 如果可以，请尝试
 * 父子类中允许有同名的变量，是不会报错的
 * - 创建子类对象，使用对象名点的形式访问同名变量，结果是什么？
 * 这个结果返回的是子类对象中的a的取值，这里我们可以做两个猜测：
 * 1，a肯定是被继承了
 * 2，a继承了以后被子类中a覆盖掉了
 * 3，a继承了以后没有被覆盖掉，但是因为某种机制无法直接对象名点去访问到
 * 这里成员变量没有被覆盖，而是被隐藏掉了
 *
 * 最终我们发现，子类可以访问到父类的成员变量
 * - 但是由于编译器检索机制的限制，好像父类的属性被隐藏了一样
 * - 称之为子类的属性隐藏
 * 编译器的检索机制：
 *  当你使用对象名点变量名的形式访问一个成员变量时，存在以下顺序的检索过程：
 *  1，从当前类中去找 Son
 *  2，如果自己类当中没有，就去父类中找
 *  3，直到找到Object为止，如果都没有找到，报错
 *
 *  实际上这种东西没太大作用，因为实际开发当中，都会封装成员变量，用private修饰，然后提供方法访问
 *
 *  这里呢，又有一个问题了，那么父类的方法返回父类的同名成员，子类的方法返回子类的同名成员，如果我想在子类方法中返回父类的同名成员变量，咋办？
 *  用super去调用即可
 *
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        Son son = new Son();
        System.out.println(son.a);//100
        System.out.println(son.returnAFather()); //10
        System.out.println(son.returnASon()); //10
    }
}

class Father{
    int a = 10;
    public int returnAFather(){
        return a;
    }
}

class Son extends Father{
    int a = 100;
    public int returnASon(){
        //这里也有一个就近原则 Java当中就近原则普遍适用

        return super.a;
    }
}
